package com.platform.core.service;

import com.fasterxml.jackson.databind.JsonNode;
import com.querydsl.core.types.Predicate;
import com.platform.dto.ConfQo;
import com.platform.core.entity.SysConf;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.util.MultiValueMap;

import java.util.List;
import java.util.Map;

/**
 * Description: 参数配置-Service接口
 *
 * @author libin Created on 2019/7/19
 **/
public interface SysConfService extends BaseEntityBiz<SysConf> {
    /**
     * 创建
     *
     * @param confQo 参数配置对象
     * @return ConfQo
     */
    ConfQo create(ConfQo confQo);

    /**
     *  创建字典,对参数类型的概念层分装
     * @param confQo 参数配置对象
     * @return ConfQo
     */
    ConfQo createSysDict(ConfQo confQo);

    /**
     * 修改
     *
     * @param confQo 参数配置对象
     * @return ConfQo
     */
    ConfQo modify(ConfQo confQo);

    /**
     * 分页查询
     *
     * @param predicate  查询条件
     * @param pageable   分页参数
     * @param parameters 查询参数
     * @return 列表
     */
    Page<ConfQo> queryConfs(Predicate predicate, Pageable pageable, MultiValueMap<String, String> parameters);


    /**
     * 分页查询
     *
     * @param predicate  查询条件
     * @param pageable   分页参数
     * @param parameters 查询参数
     * @return 列表
     */
    Page<ConfQo> searchDictGroup(Predicate predicate, Pageable pageable, MultiValueMap<String, String> parameters);

    /**
     * 查询(不分页)
     * @param predicate  查询条件
     * @param parameters 查询参数
     * @return 列表
     */
    List<ConfQo> queryConfs(Predicate predicate, MultiValueMap<String, String> parameters);

    /**
     * 检查参数配置编码是否存在
     *
     * @param id ID (修改时用)
     * @param confCode 参数配置编码
     * @param typeId 类别
     * @return 数目
     */
    Long checkCodeExists(String id, String confCode, String typeId);

    /**
     * 检查参数配置名称是否存在
     *
     * @param id ID(修改时用)
     * @param confName 参数配置名
     * @param typeId 类别
     * @return 数目
     */
    Long checkNameExists(String id, String confName, String typeId);


    /**
     * 根据编码获取配置信息
     *
     * @param confCode 参数编码
     * @return 配置
     */
    ConfQo queryByCode(String confCode);


    /**
     * 获取配置信息
     * @param code 参数编码
     * @return 配置信息列表
     */
    List<JsonNode> getConfInfo(String code);

    /**
     * 获取配置信息-value
     * @param code 参数编码
     * @return 对应的参数值
     */
    String getSingleConfInfo(String code);

    /**
     * 获取字典项信息
     * @param groupCode 等同于"参数编码"
     * @param itemCode  等同于"参数项的key"
     * @return {"123":"value"}
     */
    Map<String,Object> getSingleConfInfo(String groupCode, String itemCode);

    /**
     * 获取字典项的值
     * @param groupCode 等同于"参数编码"
     * @param itemCode  等同于"参数项的key"
     * @return "value"
     */
    Object getSingleValue(String groupCode, String itemCode);


    /**
     * 获取字典项信息
     * @param groupCode 字典组编码
     * @return map集合
     */
    List<Map<String,Object>> getDictConfInfo(String groupCode);

    /**
     * 获取字典项信息
     * @param list 字典组编码集合
     * @return map集合
     */
    Map<String,List<Map<String,Object>>> searchDictConfInfos(List<String> list);

    /**
     *  根据routeCode查询字典信息
     * @param routeCode
     * @return
     */
    ConfQo findConfByRouteCode(String routeCode);

    List<Map<String, String>> getConfList(String code);
}
